#include "listaMTF.h"

Elemento* crearLista(){
 Elemento* vector	= (Elemento*)malloc((CANT+1)*sizeof(Elemento));
 Elemento* inicio	= vector + CANT;
 Elemento* iterador	= vector;

 	 	  while(iterador <= inicio){
 	 	 	iterador->anterior  = iterador-1;
 	 	 	iterador->siguiente = iterador+1;
 	 	 	iterador++;
 	 	  }
 	 	  vector->anterior 		= NULL;
 	 	  inicio->siguiente 	= vector;

 	 	  return vector;
}

// devuelve la posicion de un elemento.
int consultarPosicion(Elemento* lista,int elemento){

 Elemento* consulta	= lista + elemento;
 Elemento* iterador	= (lista+CANT)->siguiente;
 int	  posicion	= 0;

 	 	  while(iterador != consulta){
 	 		  iterador = iterador->siguiente;
 	 		  posicion++;
 	 	  }

 return posicion;
}

// devuelve el elemento que se encuentra en una posicion.
int consultarElemento(Elemento* lista,int posicion){

 Elemento* iterador;
 Elemento* inicio;
 	 	   inicio	= lista + CANT;
 	 	   iterador = inicio->siguiente;

int		   posicionElemento	= 0;

 	 	   while( posicionElemento < posicion){
 	 		   iterador = iterador->siguiente;
 	 		   posicionElemento++;
 	 	   }
 return iterador-lista;
}

//se mueve al principio un elemento
void moverAlPrincipio(Elemento* lista,int elemento){

 Elemento* inicio 	= lista+CANT;
 Elemento* primero 	= inicio->siguiente;
 Elemento* actual 	= lista+elemento;

 	 	   if (actual != primero){

 Elemento* 		proximo	= actual->siguiente;
 Elemento* 		previo 	= actual->anterior;

				inicio->siguiente	= actual;

				actual->anterior	= NULL;
				actual->siguiente	= primero;

				primero->anterior	= actual;
				previo->siguiente	= proximo;

				proximo->anterior	= previo;
 	 	   }
 }

void eliminarLista(Elemento* lista){
	free(lista);
}

void imprimirLista(Elemento* lista){

 Elemento* inicio	= lista+CANT;
 Elemento* iterador	= inicio;

		   while(iterador->siguiente!=inicio){
			   printf(" %i ",(Elemento*)iterador->siguiente-lista);
			   iterador=iterador->siguiente;
		   }
		   printf("\n");
}

void imprimirListaInvertida(Elemento* lista){
	Elemento* iterador	= lista+CANT;
		while(iterador->anterior!=NULL){
			printf(" %i ",(Elemento*)iterador->anterior-lista);
			iterador = iterador->anterior;
		}
		printf("\n");
}

void imprimirPosiciones(Elemento *lista){
	int i = 0;
 	 	while(i<CANT){
 	 	 	printf("%i(%i) ",i,consultarPosicion(lista,i));
 	 	 	i++;
 	 	}
 	 printf("\n");
}
